package com.dp.client.views.simulacion;

import java.util.ArrayList;
import java.util.List;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.ConexionDTO;
import com.dp.client.util.Alerts;
import com.dp.client.servicios.simulacion.IServiciosSimulacion;
import com.dp.client.servicios.simulacion.IServiciosSimulacionAsync;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.clientes.IServiciosClienteAsync;
import com.dp.client.servicios.conexion.IServiciosConexion;
import com.dp.client.servicios.conexion.IServiciosConexionAsync;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.maps.client.MapOptions;
import com.google.gwt.maps.client.MapWidget;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.base.LatLngBounds;
import com.google.gwt.maps.client.mvc.MVCArray;
import com.google.gwt.maps.client.overlays.Circle;

import com.google.gwt.maps.client.overlays.MarkerShape;
import com.google.gwt.maps.client.overlays.MarkerShapeType;
import com.google.gwt.maps.client.overlays.Rectangle;
import com.google.gwt.maps.client.overlays.CircleOptions;
import com.google.gwt.maps.client.overlays.Marker;
import com.google.gwt.maps.client.overlays.MarkerOptions;
import com.google.gwt.maps.client.overlays.Polyline;
import com.google.gwt.maps.client.overlays.PolylineOptions;
import com.google.gwt.maps.client.overlays.RectangleOptions;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.dom.client.Style.Unit;
//import com.google.gwt.maps.client.InfoWindowContent;
//import com.google.gwt.maps.client.Maps;
//import com.google.gwt.maps.client.control.LargeMapControl;
//import com.google.gwt.maps.client.geom.LatLng;
//import com.google.gwt.maps.client.overlay.Marker;


public class MapaMundialPrincipal extends Composite {
	private Button btnSimulacion;
	//private TextArea txtCorrer;
	MapOptions opcion;
	MapWidget mapita;
	private Button btnCargarMapita;
	//private TextArea txtrResultados;

	public MapaMundialPrincipal() {
		
		verticalPanel = new VerticalPanel();
		verticalPanel.setStyleName("admin");
		initWidget(verticalPanel);
		//verticalPanel.setSize("336px", "259px");
		verticalPanel.setSize("700px", "100px");
		
		btnSimulacion = new Button("Iniciar simulacion");
		btnSimulacion.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {

				IServiciosSimulacionAsync serviciosSimulacion = GWT.create(IServiciosSimulacion.class);
				serviciosSimulacion.correSimulacion(new AsyncCallback<String>() {
					
					@Override
					public void onSuccess(String result) {
						//txtrResultados.setText(result);
						Window.alert(result);
					}
					
					@Override
					public void onFailure(Throwable caught) {
						Alerts.dialogErrorConexion();
						
					}
				});
			}
		});
		verticalPanel.add(btnSimulacion);
		
		btnCargarMapita = new Button("Refrescar el mapa");
		btnCargarMapita.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				insertaAlmacenYConexiones();
			}
		});
		verticalPanel.add(btnCargarMapita);
		//txtCorrer= new TextArea();
		
		crearMapa();
	}
	void crearMapa(){
		opcion = MapOptions.newInstance();
		opcion.setZoom(3);
		LatLng center = LatLng.newInstance(-12.068909,-77.075529);
		opcion.setCenter(center);
		mapita = new MapWidget(opcion);
		mapita.setHeight("600px");
		mapita.setWidth("800px");
		
		verticalPanel.add(mapita);	
		
		insertaAlmacenYConexiones();
	}

	
	private ArrayList<Polyline> lineas = new ArrayList<Polyline>();
	private ArrayList<Marker> markers = new ArrayList<Marker>();
 	private VerticalPanel verticalPanel;
	void insertaAlmacenYConexiones(){
		IServiciosAlmacenAsync almacenS = GWT.create(IServiciosAlmacen.class);
		//eliminar los marcadores
		for(Marker m: markers){
			m.close();
		}
		//eliminar las lineas
		for(Polyline p : lineas){
			MVCArray<LatLng> path = MVCArray.newInstance();
			p.setPath(path);
		}
		
		lineas.clear();
		markers.clear();
		
		almacenS.listAlmacenesConDatosEnTiempoReal(new AsyncCallback<List<AlmacenDTO>>() {
			
			@Override
			public void onSuccess(final List<AlmacenDTO> result) {
				for(AlmacenDTO alm : result){
					{PolylineOptions popt = PolylineOptions.newInstance();
					MVCArray<LatLng> path = MVCArray.newInstance();
					double det = 1;
					path.insertAt(0, LatLng.newInstance(alm.getLatitud() - det, alm.getLongitud() - det));
					path.insertAt(1, LatLng.newInstance(alm.getLatitud() + det, alm.getLongitud() - det));
					path.insertAt(2, LatLng.newInstance(alm.getLatitud() + det, alm.getLongitud() + det));
					path.insertAt(3, LatLng.newInstance(alm.getLatitud() - det, alm.getLongitud() + det));
					path.insertAt(4, LatLng.newInstance(alm.getLatitud() - det, alm.getLongitud() - det));
					popt.setPath(path);
					popt.setStrokeColor(getColor(alm.getCapacidadDisponible(), alm.getCapacidadMaxima()));
					popt.setStrokeWeight(2);
					Polyline line = Polyline.newInstance(popt);
					line.setMap(mapita);
					lineas.add(line);
					}
					{PolylineOptions popt = PolylineOptions.newInstance();
					MVCArray<LatLng> path = MVCArray.newInstance();
					double det = 0.5;
					path.insertAt(0, LatLng.newInstance(alm.getLatitud() - det, alm.getLongitud() - det));
					path.insertAt(1, LatLng.newInstance(alm.getLatitud() + det, alm.getLongitud() - det));
					path.insertAt(2, LatLng.newInstance(alm.getLatitud() + det, alm.getLongitud() + det));
					path.insertAt(3, LatLng.newInstance(alm.getLatitud() - det, alm.getLongitud() + det));
					path.insertAt(4, LatLng.newInstance(alm.getLatitud() - det, alm.getLongitud() - det));
					popt.setPath(path);
					popt.setStrokeColor(getColor(alm.getCapacidadDisponible(), alm.getCapacidadMaxima()));
					popt.setStrokeWeight(2);
					Polyline line = Polyline.newInstance(popt);
					line.setMap(mapita);
					lineas.add(line);
					}
					MarkerOptions mopt = MarkerOptions.newInstance();
					mopt.setPosition(LatLng.newInstance(alm.getLatitud(), alm.getLongitud()));
					mopt.setTitle(alm.getDescripcion());
					Marker marker = Marker.newInstance(mopt);
					marker.setMap(mapita);
					markers.add(marker);
					
				}
				
				IServiciosConexionAsync servCon = GWT.create(IServiciosConexion.class);
				servCon.getConexiones("", "", "", "", "", "", "1111111", new AsyncCallback<List<ConexionDTO>>() {
					
					@Override
					public void onSuccess(List<ConexionDTO> conexiones) {
						for(ConexionDTO c : conexiones){
							PolylineOptions popt = PolylineOptions.newInstance();
							MVCArray<LatLng> path = MVCArray.newInstance();
							for(AlmacenDTO a: result) 
								if(c.idOrigen == a.getId()) path.insertAt(0, LatLng.newInstance(a.getLatitud(), a.getLongitud()));
							for(AlmacenDTO a: result) 
								if(c.idDestino == a.getId()) path.insertAt(1, LatLng.newInstance(a.getLatitud(), a.getLongitud()));
							popt.setPath(path);
							popt.setStrokeColor("green");
							popt.setStrokeWeight(2);
							Polyline line = Polyline.newInstance(popt);
							
							line.setMap(mapita);
							lineas.add(line);
						}
					}
					
					@Override
					public void onFailure(Throwable caught) {
						Alerts.dialogErrorConexion();
					}
				});
			}
			
			private String getColor(int capacidadDisponible, int capacidadMaxima) {
				if(capacidadDisponible < 0) return "gray";
				if(capacidadDisponible * 10 < 3 * capacidadMaxima) return "red";
				if(capacidadDisponible * 10 < 7 * capacidadMaxima) return "yellow";
				if(capacidadDisponible * 10 < 11 * capacidadMaxima) return "green";
				return "black";
			}

			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	
}
